MIME-Version: 1.0
Server: CERN/3.0
Date: Wednesday, 08-Jan-97 16:41:59 GMT
Content-Type: text/html
Content-Length: 6025
Last-Modified: Thursday, 25-Apr-96 23:08:17 GMT

<HTML><HEAD>
<TITLE> Program 3 - Ray Tracing </TITLE>
</HEAD>
<BODY>
<CENTER>
<H1> Program 3 - Ray Tracing </H1>
</CENTER>
<P>
<CENTER>
<H2> Due - May 14 </H2>
</CENTER>
<P>
<CENTER>
<H2> NOTE - Assignment 3 is an OPTION to replace the second exam </H2>
</CENTER>

You are to implement a simple ray tracer, which will allow for both
mirrorlike polygons and transparent or mirrorlike spheres.  You may
assume that the only objects in your scene will be spheres or
polygons, and you may assume that you have only a very few objects in
the scene.  Your objects should be specified as a center, radius,
diffuse color, specular color, opacity, and material for spheres, and
as a list of vertices (you may assume a maximum of 4 vertices) and
the two color parameters for polygons.  You should also be able to
specify a color for the background of the scene.  You should be able
to place the viewer anywhere in the scene by specifying an eye, lookat
point, and top of head point, and you should be able to specify the
width, height, number of pixels wide, and number of pixels high of
a window centered a distance d (specified by you) along the viewing
vector.

<P>

Your goal will be to produce an interesting picture of at least one
mirrored sphere and one clear sphere in front of a large polygonal
mirror, showing interreflections and refraction effects.  You can
assume that all light sources are directional (points at infinity),
and that you have no more than 3 light sources.  You should also be
able to specify the position of these.  All specifications of the
scene geometry should be in an ascii input file, which your program
reads to produce the internal description of the situation.  You then
run the ray tracing program to produce an array of pixel colors of the
size specified for your window, which your program outputs as a <B>
ppm </B> (see below) file.  You can then use the filter <B> pnmtotiff
</B> to create a <B> tiff </B> file which can be displayed using
<B> xv </B> so that you need not write any display software.

<P>

You will need to write routines for creating a ray from the eye
through the center of each pixel in the window, computing the
intersection of any ray with a sphere or a polygon, computing
the normal to the sphere or the polygon at the intersection point,
computing the reflected and refracted (if needed) rays from the
intersection point, and computing rays from the intersection point
to each light source.  You should use the Phong lighting model to
evaluate the local illumination for each point, so you will also need
a routine to evaluate this model.  Remember that ray tracers are
recursive, you will need to make sure the recursion terminates at
a reasonable point in the calculation.

<P>

There is no user interface requirement for this assignment.  You
can use a text editor to create the input file, and you will use
xv to display your results.

<P>

Once you have the ray tracer working, you can expect to get some
really ugly pictures at first.  Plan to spend some time tweaking
the parameters of your Phong model to make the images look more
realistic.


<CENTER><H2> ppm - portable pixmap file format </H2></CENTER>

<P>

The portable pixmap format is a lowest common denominator color image
file format.  The definition is as follows:

<P>

<UL>

<LI> A "magic number" for identifying the file type.  A ppm file's
magic number is the two characters "P3".

<LI> Whitespace (blanks, TABs, CRs, LFs).

<LI> A width, formatted as ASCII characters in decimal.

<LI> Whitespace.

<LI> A height, again in ASCII decimal.

<LI> Whitespace.

<LI> The maximum color-component value, again in ASCII decimal.

<LI> Whitespace.

<LI> Width * height pixels, each three ASCII decimal values between 0
and the specified maximum value, starting at the top-left corner of
the pixmap, proceeding in normal English reading order.  The three
values for each pixel represent red, green, and blue, respectively; a
value of 0 means that color is off, and the maximum value means that
color is maxxed out.

<LI> Characters from a "#" to the next end-of-line are ignored
(comments).

<LI> No line should be longer than 70 characters.

</UL>

<P>
	  Here is an example of	a small	pixmap in this format:
<P>

	  P3
	  # feep.ppm
	  4 4
	  15
	   0  0	 0    0	 0  0	 0  0  0   15  0 15
	   0  0	 0    0	15  7	 0  0  0    0  0  0
	   0  0	 0    0	 0  0	 0 15  7    0  0  0
	  15  0	15    0	 0  0	 0  0  0    0  0  0

<P>

Programs that read this format should be as lenient as possible,
accepting anything that looks remotely like a pixmap.

<P>

There is also a variant on the format, available by setting the
RAWBITS option at compile time.  This variant is different in the
following ways:

<P>

<UL>
<LI> The "magic number" is "P6" instead of "P3".

<LI> The pixel values are stored as plain bytes, instead of ASCII decimal.

<LI> Whitespace is not allowed in the pixels area, and only a single character
of whitespace (typically a newline) is allowed after the maxval.

<LI> The files are smaller and many times faster to read and write.

</UL>

<P>

Note that this raw format canonly be used for maxvals less than
or equal to 255. If you use the <B> ppm </B> library and try to write
a file with a larger maxval, it will automatically fall back on the
slower but more general plain format.

<P>

<B> SEE ALSO </B>

<P>
giftoppm(1), gouldtoppm(1), ilbmtoppm(1), imgtoppm(1),
mtvtoppm(1), pcxtoppm(1), pgmtoppm(1), pi1toppm(1), picttoppm(1),
pjtoppm(1), qrttoppm(1), rawtoppm(1), rgb3toppm(1), sldtoppm(1),
spctoppm(1), sputoppm(1), tgatoppm(1), ximtoppm(1), xpmtoppm(1),
yuvtoppm(1), ppmtoacad(1), ppmtogif(1), ppmtoicr(1), ppmtoilbm(1),
ppmtopcx(1), ppmtopgm(1), ppmtopi1(1), ppmtopict(1), ppmtopj(1),
ppmtopuzz(1), ppmtorgb3(1), ppmtosixel(1), ppmtotga(1), ppmtouil(1),
ppmtoxpm(1), ppmtoyuv(1), ppmdither(1), ppmforge(1), ppmhist(1),
ppmmake(1), ppmpat(1), ppmquant(1), ppmquantall(1), ppmrelief(1),
pnm(5), pgm(5), pbm(5)

<P>

Copyright (C) 1989, 1991 by Jef Poskanzer.

</BODY> </HTML>

